// 预览demo http://pdfkit.org/demo/browser.html
const PDFDocument = require('pdfkit')
const fs = require('fs')
const path = require('path')
const readline = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
})

// 支持的图片格式
const support = ['jpg','jpeg','png']

// PDF file
let doc = null

exec() 


function exec() {
    // 每次处理需要新建文件
    doc = new PDFDocument({
        autoFirstPage: false
    })



    readline.question('path: ', targetPath => {
        readline.question('margin: ', margin => {
           readline.question('fileName: ', fileName => {
              const output = path.join(targetPath,`${fileName}.pdf`)
               // 读取目录
               const filePathList = readDir(targetPath)
              
              // ！！！注意，margin需要转数字，否则生成的pdf是空白的
              filePathList?generatePDF(filePathList,Number(margin),output):''
                
              console.log('\n');
              readline.question('是否需要继续处理(Y/N)：', select => {
                   switch(select) {
                      case 'Y':
                      case 'y':
                          exec()
                          break
                      case 'N':
                      case 'n':
                          // 需要关闭，否则会一直等待输入
                          readline.close()
                          break
                      default:
                          readline.close()
                   }
              })
          })
        })
    })
}



/**
 * 读取目标文件目录
 * @param {string} dirPath 读取的文件夹路径 
 * @returns {Array<string>} 返回由文件夹内所有文件绝对路径组成的字符串数组
 */
function readDir(dirPath) {
    if(!dirPath || dirPath === '') return
    try {
      const direntArr = fs.readdirSync(dirPath,{withFileTypes:true})
      let filePathList = []
      for(let item of direntArr) {
        // 非文件类型跳过
        if(!item.isFile()) continue
        // 不支持的图片类型，中断程序并打印提示
        const ext = item.name.split('.').pop()   // ！！注意：仅取最后的值
        if(!support.includes(ext)) {
          throw(`不支持该文件类型：${item.name}`)
        }
        filePathList.push(path.join(dirPath,item.name))
      }
      
      return filePathList

    } catch (error) {
      console.warn('\n',error)
      return undefined    // 出错返回undefined
    }
}

/**
 * 生成PDF文件
 * @param {string} dirPath 读取的文件夹路径 
 * @param {Array<string>} filePathList 由文件绝对路径组成的字符串数组
 * @param {number} margin 页边距
 * @param {string} output 输出路径
 */
function generatePDF( filePathList, margin, output) {

  // typeof NaN: number
  if(typeof margin !== 'number' || Number.isNaN(margin)) {
    console.log("输入的margin值有误，必须为数字类型")
    return
  }
  if(filePathList?.length === 0) return
  console.log('文件顺序：', filePathList);
  let count = 0
  // pipe 的输出，可以是一个文件或是http响应
  doc.pipe(fs.createWriteStream(output))

  for(let filePath of filePathList) {
    if(!filePath) continue
    const img = doc.openImage(filePath)

    doc.addPage({size: [img.width + margin*2, img.height + margin*2]})

    // 左上角
    doc.image(img, margin, margin)

    count++;
    // \r 回车符 ，将当前位置移到本行开头
    process.stdout.write(`完成进度：${count} / ${filePathList.length} \r`)

  }

  doc.end()

  console.log('\n Done !! ');
  console.log('\n 输出路径为:',output);

}